/**
 * @Project : algorithm-learning
 * @Author : Ruoyu Wang
 * @User : Momenta
 * @DateTime : 2024/3/16 13:54
 */

//定义一个字符串是“好串”，当且仅当可以将该字符串重排后形成回文串。
//现在给定一个字符串，小红要询问若干次，每次询问第l个字符到第r个字符是否是好串。你能帮帮她吗?
//
//输入描述
//  第一行输入两个正整数 n,q，代表字符串长度和询问次数。
//  第二行输入一个长度为 n 的，仅包含小写字母的字符串。
//  接下来的 q 行，每行输入两个正整数 l,r，代表一次询问。
//  1<= n,q <=10^5
//  1<= l,r <=n
//输出描述
//  输出9行，每行输出一个字符串代表结果。若询问的字符串是好串则输出"Yes"。否则输出"No"
//
//示例1
//输入
//5 3
//aabac
//1 3
//2 4
//3 5
//输出
//Yes
//Yes
//No
//说明
//  第一次询问，子串为"aab"，可重排为"aba”，因此是好串
//  第二次询间，子串为"aba"，本身就是回文串，因此是好串
//  第三次询问，子串为"bac"，无论怎么重排都不能形成回文串，因此不是好串

#include <cstdio>
#include <iostream>

using namespace std;

int main() {
    int n, q;
    cin >> n >> q;
    string s;
    cin >> s;
    int num[26][n + 1];
    for (int i = 0; i < 26; i++) {
        num[i][0] = 0;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 26; j++) {
            num[j][i + 1] = num[j][i];
        }
        num[s[i] - 'a'][i + 1]++;
    }

    while (q--) {
        int l, r;
        scanf("%d %d", &l, &r);
        int tmp = 0;
        for (int i = 0; i < 26; i++) {
            if ((num[i][r] - num[i][l - 1]) % 2) {
                tmp++;
            }
        }
        if (tmp > 1) {
            puts("No");
        } else {
            puts("Yes");
        }
    }
}